在三次握手发送的数据包中有两个ACK值(Acknowledgement),人们习惯一个大写,一个小写来加以区分。最近Linux运维班的老师在讲网络基础知识的时候又讲到了三次握手四次断开。我在听课的时候总是感觉这两个大小写的ACK和我以前学习网络时候理解的大小写是反着的。课余时间我就在网上查了一下这方面的资料,却看到貌似关于哪个大写哪个小写非常混乱。这样有时就会把刚学习三次握手的新手搞的晕头转向,分不清到底哪个是哪个了。
其实ACK也好,ack也好,只不过是个代号而已,叫他张三也行,叫他李四也没事,没有任何影响,因为咱们不会改动那个东西。就算是把名字记反了,对咱们也没有任何影响,大家知道三次握手的数据包里有这么两个东西就行了。
一个是确认值(Acknowledgement),为1便是确认连接。
另一个是确认编号(Acknowledgement Number),即接收到的上一次远端主机传来的seq然后+1,再发送给远端主机。提示远端主机已经成功接收上一次所有数据。
三次握手的数据包,红框内为第一次握手时IP为192.168.56.1的请求端(请求连接端)发送的seq,值为0(实际中此值不一定为0)
红框内为第二次握手时IP为192.168.56.130的服务端(被请求连接端)发送的seq,因为是服务端发给请求端的一个新的seq,所以值为0(实际中此值不一定为0)
蓝框内为Ack(Acknowledgement Number确认编号)即我理解的小写的ack,值为第一次握手时请求端发送来的seq+1即0+1=1
红框内为第三次握手时IP为192.168.56.1的请求端(请求连接端)发送的seq,因为第一次握手时它发送给服务端的seq为0(黄框内),在上次的基础上+1,值就是1。
蓝框内的Ack(Acknowledgement Number确认编号)还是我理解的小写的ack,值为第二次握手时请求端发来的seq+1,即绿框中的seq+1,值为1
那么问题来了,那个起确认连接作用的确认值即我理解的那个大写的ACK在哪呢?
在这里。
展开看一下:
对照网上找到的关于第二次握手的标志位的一张图可以看出:
确认位即ACK,为1即为确认进行连接
同步位即SYN,从第一次握手时,此位就为1
下面是网上找到的三次握手的标志图,供参考:
第一次握手的标志位
我们可以看到标志位里面只有个同步位,也就是在做请求(SYN)
第二次握手的标志位
我们可以看到标志位里面有个确认位和同步位,也就是在做应答(SYN + ACK)
第三次握手的标志位
我们可以看到标志位里面只有个确认位,也就是再做再次确认(ACK)
至此问题结束